/**
 * axios 封装
 */
import axios from "axios";
import {
  showLoadingToast,
  showDialog,
  showToast
} from 'vant';
import { useUserStore } from '@/stores/user.js'; // 引入 Pinia 的用户 store
import router from '@/router'; // 引入路由实例

// 创建一个 axios 实例
const service = axios.create({
  withCredentials: true, // 跨域请求时携带 cookies
  baseURL: import.meta.env.VITE_APIDomainName,
  timeout: 5000,
});

let toast = null;

/**
 * 请求拦截器
 */
service.interceptors.request.use((config) => {
  // 从 Pinia 中获取 token（与登录时存储的位置保持一致）
  const userStore = useUserStore();
  const token = userStore.theToken; // 直接从 store 获取，而非本地存储

  // 携带 token（根据后端要求调整头字段，常见为 Authorization）
  if (token) {
    // 若后端要求 Bearer 前缀：config.headers.Authorization = `Bearer ${token}`;
    config.headers.satoken = token; // 添加 Bearer 前缀
  }

  // 显示加载中提示
  toast = showLoadingToast({
    message: '加载中...',
    forbidClick: true,
  });
  return config;
}, (error) => {
  toast && toast.close();
  return Promise.reject(error);
});

/**
 * 响应拦截器
 */
service.interceptors.response.use((response) => {
  toast && toast.close();
  const result = response.data;

  // 假设 200 为成功状态码（根据后端实际情况调整）
  if (result.code === 200) {
    return Promise.resolve(result);
  }

  // 401 未授权：清除 token 并强制跳转登录页
  if (result.code === 401) {
    const userStore = useUserStore();
    userStore.logout(); // 调用 store 的 logout 方法清除 token 和用户信息
    showToast({
      message: "登录已过期，请重新登录",
      icon: "error",
      duration: 2000
    });
    // 跳转登录页，并记录当前路径用于登录后返回
    router.replace({
      path: '/login',
      query: { redirect: router.currentRoute.value.fullPath }
    });
    return Promise.reject(new Error(result.msg || "未授权"));
  }

  // 其他错误提示
  showDialog({
    title: "操作失败",
    message: result.msg || "服务器异常"
  });
  return Promise.reject(new Error(result.msg || "未知错误"));

}, (error) => {
  toast && toast.close();
  console.error("请求失败:", error);
  // 网络错误处理
  showDialog({
    title: "网络错误",
    message: "请检查网络连接后重试"
  });
  return Promise.reject(error);
});

export default service;